package com.tju.shortlink.project.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tju.shortlink.project.dao.entity.LinkDo;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tju.shortlink.project.dto.biz.ShortLinkStatsRecordDTO;
import com.tju.shortlink.project.dto.req.*;
import com.tju.shortlink.project.dto.resp.ShortLinkBatchCreateRespDTO;
import com.tju.shortlink.project.dto.resp.ShortLinkCreateRespDTO;
import com.tju.shortlink.project.dto.resp.ShortLinkGroupCountQueryRespDTO;
import com.tju.shortlink.project.dto.resp.ShortLinkPageRespDTO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author mxl
 * @since 2024-07-06
 */
public interface ILinkService extends IService<LinkDo> {

    /**
     * 创建短链接
     * @param requestParam 短链接基本信息
     * @return 短链接创建信息
     */
    ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam);

    ShortLinkCreateRespDTO createShortLinkByLock(ShortLinkCreateReqDTO requestParam);

    /**
     * 分页查询短链接
     * @param requestParam 分页请求参数
     * @return
     */
    IPage<ShortLinkPageRespDTO> pageShortLink(ShortLinkPageReqDTO requestParam);

    /**
     * 分组统计短链接数量
     * @param gids 分组id
     * @return
     */
    List<ShortLinkGroupCountQueryRespDTO> listGroupShortLinkCount(List<String> gids);

    /**
     * 修改短链接信息
     * @param requestParam 修改后的短链接信息
     */
    void updateShortLink(ShortLinkUpdateReqDTO requestParam);

    /**
     * 短链接跳转
     * @param shortUri 短链接路径
     * @param request HTTP 请求
     * @param response HTTP 响应
     */
    void restoreUrl(String shortUri, HttpServletRequest request, HttpServletResponse response) throws IOException;

    void shortLinkStats(ShortLinkStatsRecordDTO statsRecord);

    ShortLinkBatchCreateRespDTO batchCreateShortLink(ShortLinkBatchCreateReqDTO requestParam);

    void removeLinkByGid(ShortLinkRemoveByGidDTO requestParam);
}
